package com.wwj.auction.login.controller;

import com.wwj.auction.common.result.R;
import com.wwj.auction.common.util.MD5;
import com.wwj.auction.login.entity.UserAddress;
import com.wwj.auction.login.entity.UserInfo;
import com.wwj.auction.login.entity.vo.SimpleUserInfoVo;
import com.wwj.auction.login.entity.vo.UserInfoVo;
import com.wwj.auction.login.service.UserAddressService;
import com.wwj.auction.login.service.UserInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author wwj
 * @since 2021-08-10
 */
@RestController
@RequestMapping("/login/userInfo")
@Api("登录注册")
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserAddressService userAddressService;

    @ApiOperation("登录接口")
    @PostMapping("/login")
    public R login(@RequestBody UserInfo userInfo) {
        // 前端只会提交手机号和密码
        String phone = userInfo.getPhone();
        // 判断当前用户是否已经注册
        boolean registered = userInfoService.isRegistered(phone);
        if (!registered) {
            // 若未注册，提醒用户注册
            return R.ok().message("您还没有注册");
        }
        // 校验当前手机号对应的密码是否正确
        userInfo = userInfoService.checkUser(userInfo);
        if (userInfo != null) {
            // 更新登录时间
            userInfoService.updateLoginTime(phone);
            return R.ok().data("userInfo", userInfo).message("登录成功");
        } else {
            return R.ok().message("手机号或密码输入错误");
        }
    }


    @ApiOperation("注册接口")
    @PostMapping("/register")
    public R register(
            @ApiParam(value = "注册的用户信息", required = true)
            @RequestBody UserInfo userInfo) {
        // 前端只会提交用户类型、手机号和密码
        String phone = userInfo.getPhone();
        String code = userInfo.getCode();
        String password = userInfo.getPassword();

        if (StringUtils.isEmpty(code)) {
            // 若用户没有输入验证码
            return R.ok().message("您还没有输入验证码");
        }
        // 获取短信验证码
        String codeKey = "rr:sms:code:" + phone;
        String redisCode = (String) redisTemplate.opsForValue().get(codeKey);
        System.out.println(codeKey + "--" + redisCode);
        if (StringUtils.isEmpty(redisCode)) {
            // 若验证码为空，则表示已过期
            return R.ok().message("短信验证码已过期");
        }
        // 判断当前手机号是否已经注册
        boolean registered = userInfoService.isRegistered(phone);
        // 如果手机号已经被注册，则不允许注册，提示用户去登录即可
        if (registered) {
            return R.ok().message("手机号已经被注册");
        }
        // 若未被注册，则执行注册流程
        // 校对短信验证码
        if (!code.equals(redisCode)) {
            // 若不相等，则用户输入错误
            return R.ok().message("验证码输入错误");
        }
        // 此时用户已经输入了验证码，且Redis中的验证码尚未过期，且当前手机号未注册，允许注册
        if (StringUtils.isEmpty(password)) {
            // 若未输入密码
            return R.ok().message("请输入密码");
        }
        // 对密码进行MD5加密
        userInfo.setPassword(MD5.encrypt(password));
        // 设置逻辑删除字段
        userInfo.setIsDeleted(0);
        userInfoService.register(userInfo);
        return R.ok().message("注册成功");
    }

    /**
     * 校验手机号是否被注册，提供给短信服务远程调用
     *
     * @param phone
     * @return
     */
    @GetMapping("/checkPhone/{phone}")
    public boolean isRegistered(@PathVariable String phone) {
        return userInfoService.isRegistered(phone);
    }

    /**
     * 更新用户个人信息
     *
     * @param userInfoVo
     * @return
     */
    @PostMapping("/updateUserInfo")
    public R updateUserInfo(@RequestBody UserInfoVo userInfoVo) {
        // 获取地址信息
        List<Integer> addressList = userInfoVo.getAddress();
        // 从集合中找出省、市、县信息
        UserAddress userAddress = userInfoService.findAddressInfo(addressList);
        System.out.println(userAddress);
        userInfoService.updateUserInfo(userInfoVo, userAddress);
        return R.ok().message("修改成功");
    }

    @GetMapping("/getInfo/{userId}")
    public R getUserInfo(@PathVariable("userId") Long userId) {
        SimpleUserInfoVo simpleUserInfoVo = userInfoService.getUserInfo(userId);
        return R.ok().data("simpleUserInfoVo", simpleUserInfoVo);
    }

    /**
     * 查询用户类型
     *
     * @return
     */
    @GetMapping("/get/userType/{phone}")
    public R getUserType(@PathVariable("phone") String phone) {
        Integer userType = userInfoService.getUserType(phone);
        return R.ok().data("userType", userType);
    }

    /**
     * 获取店铺状态，查询店铺是否被查封
     * @param userId
     * @return
     */
    @GetMapping("/get/store/status/{userId}")
    public R getStoreStatus(@PathVariable("userId") Long userId) {
        Integer storeStatus = userInfoService.getStoreStatus(userId);
        return R.ok().data("storeStatus", storeStatus);
    }
}

